#ifndef __DALELIB_DALEVECTOR_H__
#define __DALELIB_DALEVECTOR_H__

namespace dalelib
{

template<int Dim,class Typ=float>
class DaleVector
{
private:

	typedef DaleVector<Dim,Typ> SelfType;

	Typ f[Dim];

public:

	DaleVector<Dim,Typ>() { }

	Typ* ptr() { return &f[0]; }
	Typ& operator[](const int _Index) { return f[_Index]; }
	const float &operator[](const int _Index) const { return f[_Index]; }

    float len2() const { return (*this)*(*this); }
    float len() const { return sqrtf(len2()); }

    float normalize() const { const float l=len(); (*this)/=l; return l; }
	SelfType unit() const { return (*this)/len(); }

	static float dot(const SelfType& _Value1,const SelfType& _Value2) { return 0.f; }
/*
#define FLOATOP(op) SelfType& operator op (const float& _Value) { for(int i=0; i<Dim; ++i) f[i]+=_Value; return *this; }
	FLOATOP(+)
	FLOATOP(-)
	FLOATOP(*)
	FLOATOP(/)
#undef FLOATOP

#define SELFOP(op) SelfType& operator op (const SelfType& _Value) { for(int i=0; i<Dim; ++i) f[i]+=_Value[i]; return *this; }
	SELFOP(+)
	SELFOP(-)
	SELFOP(*)
	SELFOP(/)
#undef SELFOP

#define FLOATOPEQ(op) SelfType& operator op##=(const float& _Value) { for(int i=0; i<Dim; ++i) f[i]+=_Value; return *this; }
	FLOATOPEQ(+)
	FLOATOPEQ(-)
	FLOATOPEQ(*)
	FLOATOPEQ(/)
#undef FLOATOPEQ

#define SELFOPEQ(op) SelfType& operator op##=(const SelfType& _Value) { for(int i=0; i<Dim; ++i) f[i]+=_Value[i]; return *this; }
	SELFOPEQ(+)
	SELFOPEQ(-)
	SELFOPEQ(*)
	SELFOPEQ(/)
#undef SELFOPEQ
*/
};

typedef DaleVector<2> vec2;
typedef DaleVector<3> vec3;
typedef DaleVector<4> vec4;

} // namespace dalelib

#endif
